﻿cmake_minimum_required (VERSION 3.8)

#编译器相关
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
    message(STATUS "current system: Linux")
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
    message(STATUS "current system: Windows")
else()
    message(STATUS "current system: ${CMAKE_HOST_SYSTEM_NAME}")
endif()


#设置多配置生成器的构建类型集 RelWithDebInfo既优化又能调试的版本
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "possible configurations" FORCE)
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type default to RelWithDebInfo, set to Release to improve performance" FORCE)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
  add_definitions("-DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG")
endif()
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
    message(STATUS "Release版本")
    set(BuildType "Release")
else()
    message(STATUS "Debug版本")
    set(BuildType "Debug")
endif()
#gcc 支持4中级别的调试信息
#-g0表示不生成调试信息
#-g3表示生成最多的调试信息
#-g默认为-g2。
#一般的调试信息包括行号，函数，外部变量。-g3包含其他额外的调试信息，比如宏定义。

#-w 关闭编译警告。平时编写c/c++代码如果不规范，编译的时候会抛出很多警告。但是一般的警告都是可以忽略的，比如类型转换。编译的时候可以加-w关闭警告
#-W 也是关闭编译警告，但是比-w智能一些，它只会显示编辑器认为会出错的警告
#-Wall, 显示所有警告。

#-O系列选项主要用于优化代码。
#-O0 不优化
#-O和-O1是等价的，不影响编译速度，并且会采用一些优化算法，降低代码大小并提高代码运行速度。
#-O2,会降低编译速度，但是除了包含-O1的优化算法之外，还会采用一些其他的优化算法来提高代码运行速度。
#-O3，除了包含-O2所有的优化外，会采取一些向量化算法，提高代码的并行执行程度，使之更充分地利用现代cpu的流水线和cache。
#-Os，-O3即使是增加代码的大小，也要提高运行速度。而这个选项在-O2的基础上，尽量减少目标的大小，这个经常用于存储量比较小的设备。
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#添加对gdb的支持
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")#编译优化


# 设置输出目录debug和release版本目录不一样
set(LIBRARY_OUTPUT_PATH ../game)
set(EXECUTABLE_OUTPUT_PATH ../game)
add_compile_options(-fPIC)#告诉编译器产生与位置无关代码(Position-Independent Code)产生的代码中，没有绝对地址，全部使用相对地址，故而代码可以被加载器加载到内存的任意位置，都可以正确的执行。这正是共享库所要求的，共享库被加载时，在内存的位置不是固定的。
set(CMAKE_CXX_STANDARD 20)#C++20

#打印编译信息
MESSAGE( STATUS "CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
MESSAGE( STATUS "CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
MESSAGE( STATUS "CXX_STANDARD: ${CMAKE_CXX_STANDARD}")
MESSAGE( STATUS "***************************************************")


#设工程目名称
set(PROJECT_NAME game)
project(${PROJECT_NAME})

# 将源代码添加到此项目的可执行文件。
file(GLOB_RECURSE ALL_FILE "*.cpp" "*.h" "*.c" "*.hpp")
add_executable(${PROJECT_NAME} ${ALL_FILE})#可执行文件用add_executable

#静态库路径通过使用 target_link_directories() 命令，可以避免在 target_link_libraries() 中指定完整的静态库路径。
target_link_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/lib)
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
    file(GLOB_RECURSE ALL_LIB "lib/*.a")#加载静态库
    target_link_libraries(${PROJECT_NAME} dl pthread)#加载动态库dlopen等需要-ldl参数
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
    file(GLOB_RECURSE ALL_LIB "lib/*.lib")#加载静态库
endif()

target_link_libraries(${PROJECT_NAME} ${ALL_LIB})


